﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//int main()
//{
//	int a = 0xf;
//	int b = 017;
//	printf("%d\n", a);
//	printf("%d", b);
//	//%d打印都是十进制//%o是打印八进制  //%x打印十六进制
//	return 0;
//}



//int main()
//{
//	int a = 10;
//	a << 5;//左移5位
//	a >> 3;//右移3位
//	float b = 3.5f;//不加f默认为double类型，加了f表示float类型
//	return 0;
//}



//不设置第三个变量，使两个整数交换

//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d%d", &a,&b);
//	printf("a=%d b=%d", a, b);
//	printf("\n");
//	a = b + a;//有溢出的风险
//	b = a - b;//b=a
//	a = a - b;//a=b
//	printf("a=%d b=%d", a, b);
//	return 0;
//}

//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d%d", &a,&b);
//	printf("a=%d b=%d", a, b);
//	printf("\n");
//	a = b ^ a;
//	b = a ^ b;//b=a^b^b=a
//	a = a ^ b;//a^b^a=a
//	printf("a=%d b=%d", a, b);
//	return 0;
//}



//练习1：编写代码实现：求⼀个整数存储在内存中的⼆进制中1的个数

//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	//统计n的补码中的1的个数----类似与取下个位数
//	//%2取个位  /2去掉一位  直到n为0
//	int count = 0;
//	while (n)
//	{
//		if ((n % 2) == 1)//为了不影响计算
//		{
//			count++;
//		}
//		n /= 2;
//	}
//	printf("%d", count);//对于负数是错误的
//	return 0;
//}

//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int count = 0;
//	//000011000011001100001101
//	//000000000000000000000001
//	//可以发现
//	//n&1==0  说明n的二进制最低位为0
//	//n&1==1  说明n的二进制最低位为1
//	//减少位数只需要右移一位,但是注意，右移是不会改变数值的！！！
//	while (n)
//	{
//		int i = 0;//用来计算需要右移的个数
//		for (i = 0; i < 32; i++)
//		{
//			if (((n >> i) & 1 )== 1)
//			{
//				count++;
//			}
//		}
//		
//	}
//	printf("%d", count);
//	return 0;
//}



////有问题
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int count = 0;
//	//000011000011001100001101
//	//000000000000000000000001
//	//可以发现
//	//n&1==0  说明n的二进制最低位为0
//	//n&1==1  说明n的二进制最低位为1
//	//减少位数只需要右移一位,但是注意，右移是不会改变数值的！！！
//	while (n) 
//	{
//		int i = 0;//用来计算需要右移的个数
//		for (i = 0; i < 32; i++)
//		{
//			if (((n >> i) & 1) == 1)
//			{
//				count++;
//			}
//		}
//
//	}
//	printf("%d", count);
//	return 0;
//}







int main()
{
	char a = 4;
	//00000000000000000000000000000100
	//00000100 - a   截断后
	char b = 127;
	//00000000000000000000000001111111
	//01111111 - b 
	char c = a + b;//整型提升
	//00000100 - a
	//提升:a的类型是char类型,在vs中char==signed char
	//00000000000000000000000000000100
	//01111111 - b
	//提升:b的类型是char类型,在vs中char==signed char
	//00000000000000000000000001111111
	//
	//00000000000000000000000000000100
	//00000000000000000000000001111111 +
	//00000000000000000000000010000011
	//10000011 - c
	printf("%d\n", c);//
	//11111111111111111111111110000011
	//10000000000000000000000001111100
	//10000000000000000000000001111101
	// -125
	//%d 打印数据,十进制的形式打印有符号的整数 int
	//%u 打印无符号的整型,unsigned int

	return 0;
}